struct Point {
    x: f64,
    y: f64,
    radius: f64,
}

impl Point {

    // 静态方法不需要被实例调用
    // 这类方法一般用作构造器（constructor）
    fn constructs()->Point{
        Point {
            x: 1.0,
            y: 2.0,
            radius: 3.0,
        }
    }

    fn new(x: f64, y: f64, radius: f64) -> Point {
        Point {
            x: x,
            y: y,
            radius: radius,
        }
    }

    // 这些方法通过关键字 self 来访问对象中的数据和其他
    fn area(&self) -> f64 {
        std::f64::consts::PI * (self.radius * self.radius)
    }
}

fn main() {
    // ;分号是没有返回值的 不带分号是传返回值的
    fn add(x: i32) -> i32 {
        x + 1
    }
    let sum_num = add(1);
    println!("{}", sum_num);

    // ！可用于返回所有类型
    fn err() -> ! {
        panic!("this is err");
    }
    // err();


    //匿名函数
    let mut num_1 = 5;
    // 创建局部作用域
    {
        let mut add_num = move |x: i32| num_1 += x;
        add_num(5);
    }
    // assert_eq!(5, num);


    let point = Point{
        x:1.0,
        y:1.0,
        radius:2.0,
    };

    println!(" area {}",point.area());
    println!(" area {}",Point::new(1.0,1.0,2.0).area());
}
